/**
 * Project Name:Test
 * File Name:RiskModelUtil.java
 * Package Name:com.bwda.dsrs.businessservice.util
 * Date:2019年5月8日
 * Copyright (c) 2019, 江苏保旺达软件有限公司 All Rights Reserved.
 *
 */
package com.bwda.dsrs.filecenter.util;

import java.util.*;

/**
 * 风险值计算
 *
 * @author yanyuemei
 * @date
 */
public class RiskModelUtil {
    public static void main(String[] args) {
        Integer[] rvArr = getRiskValues(3, 5);
        Map<Integer, String> map = getPackagesData(rvArr, 5);
        Set<Integer> keySet = map.keySet();
        for (Integer integer : keySet) {
            System.out.println("key=" + integer + " value="+map.get(integer));
        }
    }

    /**
     *
     * getRiskValues:(获取风险值，无重复)
     *
     * @author 李长春
     * @param userLevelNum 用户等级数量
     * @param fileLevelNum 文件等级数量
     * @exception
     */
    public static Integer[] getRiskValues(int userLevelNum, int fileLevelNum){
        Set<Integer> riskValueSet = new HashSet<Integer>();
        //用户等级值和文件等级值相乘得到风险值
        for(int i=1; i<=userLevelNum; i++){
            for(int j=1; j<=fileLevelNum; j++){
                riskValueSet.add(i * j);
            }
        }
        Integer[] rvArr = new Integer[riskValueSet.size()];
        riskValueSet.toArray(rvArr);
        Arrays.sort(rvArr);
        return rvArr;
    }

    /**
     *
     * getPackagesData:(获取每个策略包对应相关的风险等级和风险值)
     *
     * @author 李长春
     * @param rvArr 风险值
     * @param packagesNum 风险等级数量
     * @exception
     */
    public static Map<Integer, String> getPackagesData(Integer[] rvArr, int packagesNum ){
        int riskSize = rvArr.length;

        //key值为风险等级，value为风险值，多个以逗号隔开
        Map<Integer, String> map = new HashMap<Integer, String>(16);
        Integer i = 1;
        //如果风险值数量大于风险等级则需要计算，否则风险值数量即为风险等级数量
        if(riskSize > packagesNum){
            //商
            int quotient = riskSize / packagesNum;

            //余数
            int remainder = riskSize % packagesNum;

            //差
            int difference = packagesNum - remainder;

            int start = 0;
            for(int j=0; j<packagesNum; j++){
                //如果风险等级值小于风险等级数量和余数的差，则风险值的数量为商值
                if(j<difference){
                    map.put(j+1, composeValues(rvArr, quotient, start));
                    if(j == 0){
                        start = quotient;
                    }
                    else{
                        start = start+ quotient;
                    }
                }
                else{
                    //有余数时，风险等级高的风险值数量为商值加1
                    map.put(j+1, composeValues(rvArr, quotient+1, start));
                    start = start + quotient+1;
                }

            }
        }
        else{
            for (Integer value : rvArr) {
                map.put(i, value + "");
                i++;
            }
        }
        return map;
    }

    /**
     *
     * composeValues:(组合风险值，以英文逗号（,）隔开)
     *
     * @author 李长春
     * @param rvArr 风险值集合
     * @param num 每一级风险值数量
     * @param start 下标开始值
     * @return
     * @exception
     */
    private static String composeValues(Integer[] rvArr, int num, int start){
        StringBuilder rvs = new StringBuilder();
        for(int i=0; i<num; i++){
            if(i == 0){
                rvs.append(rvArr[start]).append("");
            }
            else{
                rvs.append(",").append(rvArr[start+i]);
            }
        }
        return rvs.toString();
    }
}
